package com.zhang.bingmei_incomeexpenditure.entity.Utils;

import lombok.extern.slf4j.Slf4j;

import java.util.Arrays;
import java.util.List;

/**
 * <pre>
 * @描述：
 * @作者：CLD
 * @创建时间：2022-03-29 17:05
 * </pre>
 **/
@Slf4j
public class SecurityPlusUtils extends SecurityUtils {
    public static Integer getMinLevel() {
        //return 1;
        return 3;
    }

    public static String getCurrentUserId() {
        //return "1";
        return "1983484911482314754"; //currentUsername:15500000003
        //return "1793536407512371201";
        //return "1781989837734240256"; //省级
    }

    public static List<Integer> getLevelList() {
        return Arrays.asList(3);
    }

    public static String getCurrentUsername() {
        return "15500000003";
    }

    public static Integer getCurrentUserRoleLevel() {
        return 3;
    }

    public static String getArea() {

//        return "460000,460100,460106,460106002000";//张三省级管理员 18880000000
        //return "460000,460100,460100004000,460100004000001";
        return "460000,460200,460204,460204198219";
        //return "460000,469005,469528";
    }
//
//    /**
//     * 获取用户所在部门id
//     *
//     * @return
//     */
//    public static String getUserDeptId() {
//        UserDetails userDetails = getCurrentUser();
//        return new JSONObject(new JSONObject(userDetails).get("user")).get("deptId", String.class);
//    }
//
//    /**
//     * 获取角色级别为最小的（权限最大的）,没有角色返回-1
//     *
//     * @return
//     */
//    public static int getMinLevel() {
//        UserDetails userDetails = getCurrentUser();
//        String rolesStr = new JSONObject(new JSONObject(userDetails).get("user")).get("roles").toString();
//        List<RoleSmallDto> roleSmallDtos = JSONUtil.toList(rolesStr, RoleSmallDto.class);
//        if (CollectionUtil.isNotEmpty(roleSmallDtos)) {
//            return Collections.min(roleSmallDtos.stream().map(RoleSmallDto::getLevel).collect(Collectors.toList()));
//        }
//        return -1;
//    }
//
//    /**
//     * 获取角色级别为最大的（权限最小的）,没有角色返回-1
//     *
//     * @return
//     */
//    public static int getMaxLevel() {
//        UserDetails userDetails = getCurrentUser();
//        String rolesStr = new JSONObject(new JSONObject(userDetails).get("user")).get("roles").toString();
//        List<RoleSmallDto> roleSmallDtos = JSONUtil.toList(rolesStr, RoleSmallDto.class);
//        if (CollectionUtil.isNotEmpty(roleSmallDtos)) {
//            return Collections.max(roleSmallDtos.stream().map(RoleSmallDto::getLevel).collect(Collectors.toList()));
//        }
//        return -1;
//    }
//
//    /**
//     * 返回数据权限类型
//     * 角色级别：1,2,3,4,5 按照辖区控制数据权限
//     * 角色级别：6 按照所属行业控制数据权限
//     * 角色级别：7 按照上报单位控制数据权限
//     *
//     * @return
//     */
//    public static DataScope getDataScope() {
//        int minLevel = getMinLevel();
//
//        String area = getArea();
//        DataScope dataScope = new DataScope();
//        dataScope.setUserId(getCurrentUserId());
//        dataScope.setMinLevel(minLevel);
//        if (StringUtils.isNotBlank(area)){
//            String[] areaList = area.split(",");
//            //1系统管理员和2省级管理员管辖区域都为海南省
//            if (minLevel == 1 || minLevel == 2) {
//                dataScope.setArea("460000");
//
//                //3市县级管理员
//            } else if (minLevel == 3) {
//                if (areaList.length >= 2) {
//                    dataScope.setArea(areaList[0]+","+areaList[1]);
//                }
//                //4区级管理员
//            } else if (minLevel == 4) {
//                if ((area.contains("460100") || area.contains("460200") || area.contains("460300")) && areaList.length >= 3) {
//                    dataScope.setArea(areaList[0]+","+areaList[1]+","+areaList[2]);
//                }
//
//                //5街道/乡镇管理员
//            } else if (minLevel == 5) {
//                if ((area.contains("460100") || area.contains("460300")) && areaList.length >= 4){
//                    dataScope.setArea(areaList[0]+","+areaList[1]+","+areaList[2]+","+areaList[3]);
//                }
//                // 三亚没有乡镇街道
////                else if (!area.contains("460200") && areaList.length >= 3){
////                    dataScope.setArea(areaList[0]+","+areaList[1]+","+areaList[2]);
////                }
//            }
//            // 村/社区
//            else if (minLevel == 9) {
//                if ((area.contains("460100") || area.contains("460300"))  && areaList.length >= 5){
//                    dataScope.setArea(areaList[0]+","+areaList[1]+","+areaList[2]+","+areaList[3]+","+areaList[4]);
//                }else if (!area.contains("460200") && areaList.length >= 4){
//                    dataScope.setArea(areaList[0]+","+areaList[1]+","+areaList[2]+","+areaList[3]);
//                }
//            }
//
//            //6行业管理员
////        } else if (minLevel == 6) { // 按照所属行业控制数据权限
////            SysIndustryAreaService sysIndustryAreaService = SpringContextHolder.getBean(SysIndustryAreaService.class);
////            List<String> IndustryAreaIds = sysIndustryAreaService.getIndustryAreaIds(getCurrentUserId());
////            dataScope.setIndustryAreaIdList(IndustryAreaIds);
////            dataScope.setDataScopeType(2);
////
////            //7台账管理员
////        } else if (minLevel == 7) { // 按照上报单位控制数据权限
////            dataScope.setDataScopeType(3);
////            dataScope.setUnitIdList(getUnitIds());
////        }
//        }
//        return dataScope;
//    }
//
//    /**
//     * 角色权限并集
//     * 角色级别：1,2,3,4,5 按照辖区控制数据权限
//     * 角色级别：6 按照所属行业控制数据权限
//     * 角色级别：7 按照上报单位控制数据权限
//     * 角色级别：8 按照所属PCO公司控制数据权限
//     * @return
//     */
//    public static DataScope getDataScopeBy() {
//        DataScope dataScope = getDataScope();
//        List<Integer> levelList = getLevelList();
//        if (CollectionUtil.isNotEmpty(levelList)){
//            //处理行业管理员权限
//            if (levelList.contains(6)){
//                //如果有台账管理员角色，处理管理的上报单位填入
//                dataScope.setIndustryAreaIdList(getIndustryAreaIds());
//            }
//            //处理台账管理员权限
//            if (levelList.contains(7)){
//                //如果有台账管理员角色，处理管理的上报单位填入
//                dataScope.setUnitIdList(getUnitIds());
//            }
//            //处理消杀管理员权限
//            if (levelList.contains(8)){
//                //如果有消杀管理员角色，处理管理的PCO公司填入
//                dataScope.setPcoId(getPcoId());
//            }
//
//        }
//        dataScope.setLevelList(levelList);
//        return dataScope;
//    }
//
//
//    /**
//     * 获取管理的PCO公司id
//     * @return
//     */
//    public static String getPcoId() {
//        SysUsersDisinfectService sysUsersDisinfectService = SpringContextHolder.getBean(SysUsersDisinfectService.class);
//        return sysUsersDisinfectService.getPcoId(getCurrentUserId());
//    }
//
//    /**
//     * 获取管理的PCO公司名称
//     * @return
//     */
//    public static String getPcoName() {
//        SysPcoService sysPcoService = SpringContextHolder.getBean(SysPcoService.class);
//        SysPco pco = sysPcoService.getById(getPcoId());
//        if (pco != null){
//            return pco.getName();
//        }
//        return null;
//    }
//
//    /**
//     * 获取管理的行业id
//     * @return
//     */
//    public static List<String> getIndustryAreaIds(){
//        SysIndustryAreaService sysIndustryAreaService = SpringContextHolder.getBean(SysIndustryAreaService.class);
//        return sysIndustryAreaService.getIndustryAreaIds(getCurrentUserId());
//    }
//
//    /**
//     * 获取行业管理区域列表
//     * @return
//     */
//    public static List<String> getIndustryAreas(){
//        SysIndustryAreaService sysIndustryAreaService = SpringContextHolder.getBean(SysIndustryAreaService.class);
//        return sysIndustryAreaService.getIndustryAreas(getCurrentUserId());
//    }
//
//    /**
//     * 获取台账管理员管辖区域
//     * @return
//     */
//    public static List<String> getUnitAreas(){
//        SysUnitsUsersService sysUnitsUsersService = SpringContextHolder.getBean(SysUnitsUsersService.class);
//        return sysUnitsUsersService.getLevelCodes(getCurrentUserId(), null);
//    }
//
//    public static String getIndustryNames(){
//        SysIndustryAreaService sysIndustryAreaService = SpringContextHolder.getBean(SysIndustryAreaService.class);
//        return sysIndustryAreaService.getIndustryNames(getCurrentUserId());
//    }
//
//    /**
//     * 获取管理的上报单位id
//     * @return
//     */
//    public static List<String> getUnitIds(){
//        SysUnitsUsersService sysUnitsUsersService = SpringContextHolder.getBean(SysUnitsUsersService.class);
//        return sysUnitsUsersService.getUnitIds(getCurrentUserId());
//    }
//
//    /**
//     * 获取管理的上报单位名称
//     * @return
//     */
//    public static String getUnitNames(){
//        SysUnitsUsersService sysUnitsUsersService = SpringContextHolder.getBean(SysUnitsUsersService.class);
//        List<String> ids = sysUnitsUsersService.getUnitIds(getCurrentUserId());
//        if (CollectionUtil.isNotEmpty(ids)){
//            SysUnitInfoService sysUnitInfoService = SpringContextHolder.getBean(SysUnitInfoService.class);
//            List<SysUnitInfo> unitInfos = sysUnitInfoService.listByIds(ids);
//            if (CollectionUtil.isNotEmpty(unitInfos)){
//                return unitInfos.stream().map(SysUnitInfo::getName).collect(Collectors.joining("、"));
//            }
//        }
//        return null;
//    }
//
//    public static QueryPermissionDto checkCityPermisson(QueryPermissionDto req) {
//        //获取该账号的权限类型，如果是有区域权限的，可以查看，如果没有权限查询区域的返回错误信息
//        DataScope dataScope = SecurityPlusUtils.getDataScope();
//        DataScope.CityInfo cityInfo = dataScope.getCityInfo();
//        if (isAdmin()) {
//            return req;
//        } else {
//            if (dataScope.getDataScopeType() == 1) {
//                if (req.getCity() == null && req.getTown() == null) {
//                    BeanUtil.copyProperties(cityInfo, req);
//                } else {
//                /*//海南省卫健委的账号可以查询的到全部，这部分的权限控制还需要考虑
//                if(cityInfo.getCity() != 21){*/
//                    String[] areaArray = {String.valueOf(cityInfo.getProvince()), String.valueOf(cityInfo.getCity()), String.valueOf(cityInfo.getTown())};
//                    String areaString = getAreaString(areaArray);
//                    String[] reqArray = {String.valueOf(cityInfo.getProvince()), String.valueOf(req.getCity()), String.valueOf(req.getTown()),};
//                    String reqString = getAreaString(reqArray);
//                    //如果请求的区域查询参数reqString是以账号的权限areaString开头，说明是该账号的下属区域，可以查询
//                    if (!reqString.startsWith(areaString)) {
//                        return null;
//                    }
//                    //}
//                }
//            } else if (dataScope.getDataScopeType() == 2) {
//                req.setDeptId(SecurityPlusUtils.getUserDeptId());
//                req.setDetectionOrgId(SecurityPlusUtils.getUserDeptId());
//            } else if (dataScope.getDataScopeType() == 3) {
//                req.setCreateBy(SecurityPlusUtils.getCurrentUsername());
//            } else {
//                return null;
//            }
//            log.info("权限类型：" + dataScope.getDataScopeType() + "权限参数：" + req.toString());
//            return req;
//        }
//    }
//
//    public static String getAreaString(String[] areaArray) {
//        List<String> objects = new ArrayList<>(Arrays.asList(areaArray));
//        objects.removeIf(o -> o.equals("null"));
//        return StringUtils.join(objects, "|");
//    }
//
//    public static List<Integer> getLevelList() {
//        UserDetails userDetails = getCurrentUser();
//        String rolesStr = new JSONObject(new JSONObject(userDetails).get("user")).get("roles").toString();
//        List<RoleSmallDto> roleSmallDtos = JSONUtil.toList(rolesStr, RoleSmallDto.class);
//        if (CollectionUtil.isNotEmpty(roleSmallDtos)) {
//            List<Integer> list = roleSmallDtos.stream().map(RoleSmallDto::getLevel).collect(Collectors.toList());
//            return list;
//        }
//        return null;
//    }
//
//    public static AreaMergeVO getAreaMerge(){
//        List<Integer> list = getLevelList();
//
//        String area = getArea();
//        String[] areaList = area.split(",");
//        AreaMergeVO areaMerge = new AreaMergeVO();
//        Integer level = 99;
//        if (CollectionUtil.isNotEmpty(list)) {
//            //1系统管理员和2省级管理员管辖区域都为海南省
//            if (list.contains(1) || list.contains(2)) {
//                areaMerge.setArea("460000");
//                areaMerge.setAreaLevel(1);
//                areaMerge.setMinLevel(1);
//                return areaMerge;
//                //3市县级管理员
//            } else if (list.contains(3)) {
//                if (areaList.length >= 2) {
//                    areaMerge.setArea(areaList[0]+","+areaList[1]);
//                    level = 2;
//                    areaMerge.setAreaLevel(2);
//                }
//
//                //4区级管理员
//            } else if (list.contains(4)) {
//                if ((area.contains("460100") || area.contains("460200")) && areaList.length >= 3) {
//                    areaMerge.setArea(areaList[0]+","+areaList[1]+","+areaList[2]);
//                    level = 3;
//                    areaMerge.setAreaLevel(3);
//                }
//
//                //5街道/乡镇管理员
//            } else if (list.contains(5)) {
//                if (area.contains("460100") && areaList.length >= 4){
//                    areaMerge.setArea(areaList[0]+","+areaList[1]+","+areaList[2]+","+areaList[3]);
//                    areaMerge.setAreaLevel(4);
//                    level = 4;
//                }else if (!area.contains("460200") && areaList.length >= 3){
//                    areaMerge.setArea(areaList[0]+","+areaList[1]+","+areaList[2]);
//                    level = 3;
//                    areaMerge.setAreaLevel(3);
//                }
//            }
//            // 9 村/社区
//            else if (list.contains(9)) {
//                if (area.contains("460100") && areaList.length >= 5){
//                    areaMerge.setArea(areaList[0]+","+areaList[1]+","+areaList[2]+","+areaList[3]+","+areaList[4]);
//                    areaMerge.setAreaLevel(5);
//                    level = 5;
//                }else if (!area.contains("460200") && areaList.length >= 4){
//                    areaMerge.setArea(areaList[0]+","+areaList[1]+","+areaList[2]+","+areaList[3]);
//                    level = 4;
//                    areaMerge.setAreaLevel(4);
//                }
//            }
//
//            //行业管理员管辖区域
//            if (list.contains(6)) {
//                SysIndustryAreaService sysIndustryAreaService = SpringContextHolder.getBean(SysIndustryAreaService.class);
//                IndustryAreaMergeVO industryAreaMerge = sysIndustryAreaService.getLevelCodes(getCurrentUserId(),areaMerge.getArea());
//                areaMerge.setIndustryAreaMerge(industryAreaMerge);
//                if (industryAreaMerge.getIsProvince()){
//                    areaMerge.setMinLevel(1);
//                }
//                if (CollectionUtil.isNotEmpty(industryAreaMerge.getCityCodes())) {
//                    level = level > 2?2:level;
//                }
//                if (CollectionUtil.isNotEmpty(industryAreaMerge.getDistrictCodes())) {
//                    level = level > 3?3:level;
//                }
//                if (CollectionUtil.isNotEmpty(industryAreaMerge.getStreetCodes())) {
//                    level = level > 4?4:level;
//                }
//            }
//
//            //台账管理员管辖区域
//            if (list.contains(7)) {
//                SysUnitsUsersService sysUnitsUsersService = SpringContextHolder.getBean(SysUnitsUsersService.class);
//                List<String> unitAreaList = sysUnitsUsersService.getLevelCodes(getCurrentUserId(),areaMerge.getArea());
//                areaMerge.setUnitAreaList(unitAreaList);
//                //如果有属于非海口区域，那等级则为3，全为海口则为4
//                int unitLevel = unitAreaList.stream().anyMatch(a -> !a.contains("460100"))?3:4;
//                level = level > unitLevel?unitLevel:level;
//            }
//        }
//
//        if (areaMerge.getMinLevel() == null){
//            areaMerge.setMinLevel(level);
//        }
//
//        return areaMerge;
//    }
//
//    public static String getLevelCode(){
//        Integer level = getMinLevel();
//        String area = getArea();
//        String[] areaList = area.split(",");
//        String levelCode = null;
//        if (level == 1 || level == 2){
//            levelCode = "460000";
//        }else if (level == 3 && areaList.length >= 2){
//            levelCode = areaList[0]+","+areaList[1];
//        }else if (level == 4 && (area.contains("460100") || area.contains("460200")) && areaList.length >= 3){
//            levelCode = areaList[0]+","+areaList[1]+","+areaList[2];
//        }else if (level == 5){
//            if (area.contains("460100") && areaList.length >= 4){
//                levelCode = areaList[0]+","+areaList[1]+","+areaList[2]+","+areaList[3];
//            }else if (!area.contains("460200") && areaList.length >= 3){
//                levelCode = areaList[0]+","+areaList[1]+","+areaList[2];
//            }
//        }
//        return levelCode;
//    }
//
//    /**
//     * 获取管理权限的地域code
//     * @return
//     */
//    public static List<String> getLevelCodes(){
//        List<Integer> levels = getLevelList();
//        log.info("账号权限级别：{}",levels);
//        log.info("账号权限级别：{}",levels);
//        String area = getArea();
//        String[] areaList = area.split(",");
//        List<String> levelCodes = new ArrayList<>();
//
//        levels.forEach(level -> {
//            String levelCode = null;
//            if (level == 1 || level == 2){
//                levelCode = "460000";
//            }else if (level == 3 && areaList.length >= 2){
//                levelCode = areaList[1];
//            }else if (level == 4 && (area.contains("460100") || area.contains("460200") || area.contains("460300")) && areaList.length >= 3){  // 海口、三亚、三沙有区，其他没有
//                levelCode = areaList[2];
//            }else if (level == 5){
//                if ((area.contains("460100") || area.contains("460300"))  && areaList.length >= 4){  // 海口三沙多了区一级
//                    levelCode = areaList[3];
//                }else if (!area.contains("460200") && areaList.length >= 3){    // 三亚没有 街道/乡镇
//                    levelCode = areaList[2];
//                }
//            } else if (level == 9) {
//                if ((area.contains("460100") || area.contains("460300"))  && areaList.length >= 5){ // 海口三沙多了区一级
//                    levelCode = areaList[4];
//                }else if (areaList.length >= 4){
//                    levelCode = areaList[3];
//                }
//            }
//            if (levelCode != null) {
//                levelCodes.add(levelCode);
//            }
//        });
//
//        return levelCodes;
//    }
//
//    /**
//     * 获取账号最高权限的管理的地域levelCode
//     * @return
//     */
//    public static String getMaxLevelCode(){
//        Integer level = getMinLevel();
//        String area = getArea();
//        String[] areaList = area.split(",");
//        String levelCode = null;
//        if (level == 1 || level == 2){
//            levelCode = "460000";
//        }else if (level == 3 && areaList.length >= 2){
//            levelCode = areaList[1];
//        }else if (level == 4 && (area.contains("460100") || area.contains("460200") || area.contains("460300")) && areaList.length >= 3){  // 海口、三亚、三沙有区，其他没有
//            levelCode = areaList[2];
//        }else if (level == 5){
//            if ((area.contains("460100") || area.contains("460300"))  && areaList.length >= 4){  // 海口三沙多了区一级
//                levelCode = areaList[3];
//            }else if (!area.contains("460200") && areaList.length >= 3){    // 三亚没有 街道/乡镇
//                levelCode = areaList[2];
//            }
//        } else if (level == 9) {
//            if ((area.contains("460100") || area.contains("460300"))  && areaList.length >= 5){ // 海口三沙多了区一级
//                levelCode = areaList[4];
//            }else if (areaList.length >= 4){
//                levelCode = areaList[3];
//            }
//        }
//        return levelCode;
//    }
}
